import type { PropType } from 'vue';
import { type FormInteractionMode, type FormSchema } from './types/form';

import { propTypes } from '@/utils/propTypes';
import { type CardBottomBtnsOptions } from "@/components/TButtonGroup/types";

export const basicProps = {
  model: {
    type: Object as PropType<Recordable>,
    default: {},
  },

  /**
   * 表单交互模式
   * normal 普通
   * details 详情模式 (隐藏组件UI及功能, 按详情模式展示)
   * edit 编辑模式 (可拖动, 工具条, 默认禁用, 显示默认提示语, 禁用表单验证)
   */
  formInteractionMode: {
    type: String as PropType<FormInteractionMode>,
    default: 'normal'
  },

  // 表单配置规则
  schemas: {
    type: Array as PropType<FormSchema[]>,
    default: () => [],
  },

  // 标签宽度  固定宽度
  labelWidth: {
    type: [Number, String] as PropType<number | string>,
    default: 100,
  },

  // 校验错误信息提示方式 默认 undertext 取值 [undertext|toast|modal]
  errShowType: propTypes.oneOf(['undertext', 'toast', 'modal']).def('undertext'),

  // 表单验证时机
  validateTrigger: propTypes.oneOf(['bind', 'submit', 'blur']).def('submit'),

  // label位置
  labelPosition: propTypes.oneOf(['left', 'top']).def('left'),

  // label 布局
  labelAlign: propTypes.oneOf(['left', 'center', 'right']).def('left'),

  // 重置时是否提交表单
  submitOnReset: propTypes.bool.def(false),

  // 是否显示分格线
  border: propTypes.bool.def(false),

  // 额外传递到子组件的参数 values
  mergeDynamicData: {
    type: Object as PropType<Recordable>,
    default: null,
  },

  // 向表单内所有组件传递 disabled 属性，自定义组件需自行实现 disabled 接收
  disabled: propTypes.bool.def(false),

  /** 按钮配置 */
  btnGroupOptions: Object as PropType<CardBottomBtnsOptions>,

  // 	校验信息是否加入 label
  rulesMessageJoinLabel: propTypes.bool.def(true),
  // 自定义重置函数
  resetFunc: Function as PropType<() => Promise<void>>,
  submitFunc: Function as PropType<() => Promise<void>>,

  // 是否滚动页面到验证错误的项
  isScrollToError: propTypes.bool.def(true),

  /** 工具条的编辑事件回调 */
  onToolbarEditEvent: Function as PropType<(schema: FormSchema) => Promise<FormSchema>>,
  /** 工具条的复制事件回调 */
  onToolbarCopyEvent: Function as PropType<(schema: FormSchema) => void>,
};
